/**
 * @param {number[][]} matrix
 * @return {void} Do not return anything, modify matrix in-place instead.
 */
var setZeroes = function (matrix) {
  let m = matrix.length; // 矩阵的行数
  let n = matrix[0].length; // 矩阵的列数

  // 使用Set存储需要置零的行和列
  // mSet存储所有需要置零的行号
  // nSet存储所有需要置零的列号
  let mSet = new Set();
  let nSet = new Set();

  // 第一次遍历：找出所有值为0的元素，记录其所在的行和列
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      if (matrix[i][j] === 0) {
        mSet.add(i); // 记录行号
        nSet.add(j); // 记录列号
      }
    }
  }

  // 第二次遍历：根据mSet中的行号，将对应行的所有元素置为0
  for (const key of mSet) {
    for (let i = 0; i < n; i++) {
      matrix[key][i] = 0;
    }
  }

  // 第三次遍历：根据nSet中的列号，将对应列的所有元素置为0
  for (const key of nSet) {
    for (let i = 0; i < m; i++) {
      matrix[i][key] = 0;
    }
  }

  // 注意：题目要求不返回任何值，但为了测试方便，这里返回修改后的矩阵
  // 在实际提交时可以移除这行
  return matrix;
};
// 这种虽然是写出来了结果，但是没有满足问题的条件
// 这种写法的时间复杂度是 O(n)
// 空间复杂度是 O(m+n)